# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import codecs
import json
import MySQLdb
import MySQLdb.cursors
from scrapy.pipelines.images import ImagesPipeline
from ArticleSpider.items import JobBoleArticleItem
from scrapy.exporters import JsonItemExporter
from twisted.enterprise import adbapi


class ArticlespiderPipeline(object):
    def process_item(self, item, spider):
        return item




class JsonWithEncodingPipeline(object):
    def __init__(self):
        self.file=codecs.open("article.json", "w", encoding="utf-8")
    def process_item(self, item, spider):
        lines=json.dumps(dict(item),ensure_ascii=False)+"\n"
        self.file.write(lines)
        return item
    def spider_closed(self,spider):
        self.file.close()
        
        
        
class JsonExporterPipleline(object):
    
    #调用scrapy提供的JsonItemExporter，导出json文件
    def __init__(self):
        self.file=open("articleexport.json", "wb")
        self.exporter = JsonItemExporter(self.file, encoding="utf-8",ensure_ascii=False)
        self.exporter.start_exporting()
    def close_spider(self,spider):
        self.exporter.finish_exporting()
        self.file.close()
    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item
    
    
    
    
#同步方法写入mysql    
class MysqlPipeline(object):
    def __init__(self):
        self.conn=MySQLdb.connect("120.25.100.39","root","1234.abcd","test_spider",charset="utf8",use_unicode=True)
        self.cursor=self.conn.cursor()
    def process_item(self, item, spider):
        insert_sql = """
            insert into `jobbole` (`title`, `create_date`, `url`, `url_object_id`, `parise_num`, `fav_num`, `com_num`,`tags`) 
            values(%s,%s,%s,%s,%s,%s,%s,%s);
        """
        self.cursor.execute(insert_sql,(item["title"],str(item["create_date"]),item["url"],item["url_object_id"],item["parise_num"],item["fav_num"],item["com_num"],"null"))
        self.conn.commit()
        return item

class MysqlTwistedPipeline(object):
    def __init__(self, dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
        dbparms = dict(
            host = settings["MYSQL_HOST"],
            db = settings["MYSQL_DBNAME"],
            user = settings["MYSQL_USER"],
            passwd = settings["MYSQL_PASSWD"],
            charset='utf8',
            cursorclass=MySQLdb.cursors.DictCursor,
            use_unicode=True,
        )
        dbpool = adbapi.ConnectionPool("MySQLdb", **dbparms)

        return cls(dbpool)

    def process_item(self, item, spider):
        #使用twisted将mysql插入变成异步执行
        query = self.dbpool.runInteraction(self.do_insert, item)
        query.addErrback(self.handle_error, item, spider) #处理异常

    def handle_error(self, failure, item, spider):
        #处理异步插入的异常
        print (failure)

    def do_insert(self, cursor, item):
        #执行具体的插入
        #根据不同的item 构建不同的sql语句并插入到mysql中
        insert_sql = """
            insert into `jobbole` (`title`, `create_date`, `url`, `url_object_id`, `parise_num`, `fav_num`, `com_num`,`tags`) 
            values(%s,%s,%s,%s,%s,%s,%s,%s);
        """
        
        cursor.execute(insert_sql,(item["title"],str(item["create_date"]),item["url"],item["url_object_id"],item["parise_num"],item["fav_num"],item["com_num"],"null"))


        
        
        
        
class ArticleImagePipeline(ImagesPipeline):
    def item_completed(self, results, item, info):
        if "front_image_url" in item:
            for ok,value in results:
                image_file_path=value["path"]
            item["front_image_path"]=image_file_path
        return item
#         if isinstance(item, dict) or self.images_result_field in item.fields:
#             item[self.images_result_field] = [x for ok, x in results if ok]
#         return item